home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / cp2dekit / samples / binfmem.cpp < prev    next >
C/C++ Source or Header  |  1996-12-29  |  2KB  |  120 lines

  1. //***************************************************************************
  2. //
  3. // this file is (c) '94-'96 Niklas Beisert
  4. //
  5. // this file is part of the cubic player development kit.
  6. // you may only use/modify/spread this file under the terms stated
  7. // in the cubic player development kit accompanying documentation.
  8. //
  9. //***************************************************************************
  10.  
  11.  
  12. #include <string.h>
  13. #include <stdlib.h>
  14. #include "binfile.h"
  15.  
  16. mbinfile::mbinfile()
  17. {
  18. }
  19.  
  20. int mbinfile::open(void *buf, long len, int type)
  21. {
  22.   close();
  23.   filebuf=(char*)buf;
  24.   mode=canread|canseek|((type&openrw)?canwrite:0);
  25.   filepos=0;
  26.   filelen=len;
  27.   freemem=type&openfree;
  28.   return 1;
  29. }
  30.  
  31. int mbinfile::opencs(void *&buf, long &len, int inc)
  32. {
  33.   close();
  34.   fbuf=&buf;
  35.   flen=&len;
  36.   fbuflen=*flen;
  37.   fleninc=inc;
  38.   mode=canread|canwrite|canseek|canchsize;
  39.   filelen=*flen;
  40.   filebuf=(char*)*fbuf;
  41.   filepos=0;
  42.   return 1;
  43. }
  44.  
  45. void mbinfile::close()
  46. {
  47.   if (mode&canchsize)
  48.     *fbuf=realloc(*fbuf,*flen);
  49.   else
  50.     if (mode&&freemem)
  51.       delete *fbuf;
  52.   binfile::close();
  53. }
  54.  
  55. long mbinfile::read(void *buf, long len)
  56. {
  57.   if (!(mode&canread))
  58.     return 0;
  59.   if ((filepos+len)>filelen)
  60.     len=filelen-filepos;
  61.   memcpy(buf, filebuf+filepos, len);
  62.   filepos+=len;
  63.   return len;
  64. }
  65.  
  66. long mbinfile::write(const void *buf, long len)
  67. {
  68.   if (!(mode&canwrite))
  69.     return 0;
  70.   if (len>(filelen-filepos))
  71.   {
  72.     chsize(filepos+len);
  73.     if (len>(filelen-filepos))
  74.       len=filelen-filepos;
  75.   }
  76.   memcpy(filebuf+filepos, buf, len);
  77.   filepos+=len;
  78.   return len;
  79. }
  80.  
  81. long mbinfile::seek(long pos)
  82. {
  83.   if (!(mode&canseek))
  84.     return filepos;
  85.   if (pos<0)
  86.     pos=0;
  87.   if (pos>filelen)
  88.     pos=filelen;
  89.   if (pos==filepos)
  90.     return filepos;
  91.   filepos=pos;
  92.   return filepos;
  93. }
  94.  
  95. long mbinfile::chsize(long len)
  96. {
  97.   if (!(mode&canchsize))
  98.     return filelen;
  99.   if (len<0)
  100.     len=0;
  101.   if (len<=fbuflen)
  102.   {
  103.     *flen=len;
  104.     filelen=*flen;
  105.     return filelen;
  106.   }
  107.   void *n=realloc(*fbuf,len+fleninc);
  108.   if (!n)
  109.     return filelen;
  110.   *fbuf=n;
  111.   *flen=len;
  112.   fbuflen=len+fleninc;
  113.   filebuf=(char*)*fbuf;
  114.   memset(filebuf+filelen, 0, fbuflen-filelen);
  115.   filelen=*flen;
  116.   if (filepos>filelen)
  117.     filepos=filelen;
  118.   return filelen;
  119. }
  120.